package com.gzc.just.play.last.war.sceneserver.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

import java.util.List;
import java.util.Optional;

/**
 * 基础数据访问接口
 * 
 * 为所有Repository提供通用方法
 * 作为Phase 4.3数据库持久化集成的一部分
 */
@NoRepositoryBean
public interface BaseRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
    
    /**
     * 根据ID列表查找实体
     */
    List<T> findByIdIn(List<ID> ids);
    
    /**
     * 查找所有活跃的实体（需要实体有isActive字段）
     */
    List<T> findByIsActiveTrue();
    
    /**
     * 查找所有非活跃的实体
     */
    List<T> findByIsActiveFalse();
    
    /**
     * 根据状态查找实体（需要实体有status字段）
     */
    List<T> findByStatus(Integer status);
    
    /**
     * 根据状态查找实体（分页）
     */
    Page<T> findByStatus(Integer status, Pageable pageable);
    
    /**
     * 根据创建时间范围查找实体
     */
    List<T> findByCreateTimeBetween(Object startTime, Object endTime);
    
    /**
     * 根据创建时间范围查找实体（分页）
     */
    Page<T> findByCreateTimeBetween(Object startTime, Object endTime, Pageable pageable);
    
    /**
     * 查找最近创建的实体
     */
    List<T> findTop10ByOrderByCreateTimeDesc();
    
    /**
     * 查找最近创建的实体（分页）
     */
    Page<T> findByOrderByCreateTimeDesc(Pageable pageable);
    
    /**
     * 根据更新时间查找实体
     */
    List<T> findByUpdateTimeAfter(Object time);
    
    /**
     * 统计活跃实体数量
     */
    long countByIsActiveTrue();
    
    /**
     * 统计非活跃实体数量
     */
    long countByIsActiveFalse();
    
    /**
     * 统计指定状态的实体数量
     */
    long countByStatus(Integer status);
    
    /**
     * 查找指定ID的活跃实体
     */
    Optional<T> findByIdAndIsActiveTrue(ID id);
    
    /**
     * 查找指定ID的实体（需要实体有playerId字段）
     */
    Optional<T> findByPlayerIdAndIsActiveTrue(Long playerId);
    
    /**
     * 查找指定玩家的所有实体（需要实体有playerId字段，分页）
     */
    Page<T> findByPlayerIdAndIsActiveTrue(Long playerId, Pageable pageable);
}